<?php

namespace app\common\service;

use GuzzleHttp\Client;
use GuzzleHttp\Exception\RequestException;
use think\Config;

class GoogleLoginService
{

    /**
     * 2. 验证 access_token 有效性（避免伪造或过期的 token）
     * @param string $access_token 待验证的 access_token
     * @return bool 有效返回 true，无效返回 false
     */
    public static function verifyAccessToken(string $access_token): bool
    {
        if (empty($access_token)) {
            return false;
        }

        try {
            $client = new Client(Config::get('google.guzzle'));
            // 调用 Google Token 验证 API
            $response = $client->get('https://oauth2.googleapis.com/tokeninfo', [
                'query' => ['access_token' => $access_token]
            ]);

            $tokenInfo = json_decode($response->getBody()->getContents(), true);

            // 校验核心字段（确保 token 属于当前应用）
            if (
                empty($tokenInfo['aud']) ||
                $tokenInfo['aud'] !== Config::get('google.client_id') ||
                (!empty($tokenInfo['expires_in']) && $tokenInfo['expires_in'] <= 0)
            ) {
                trace('Google access_token 无效：aud 不匹配或已过期');
                return false;
            }

            return true;
        } catch (RequestException $e) {
            trace(["Google access_token 验证失败：" => $e->getMessage()]);
            return false;
        }
    }
    /**
     * 3. 用 access_token 获取用户信息（通过 Google UserInfo API）
     * @param string $access_token 有效的 access_token
     * @return array|null 成功返回用户信息数组，失败返回 null
     */
    public static function getUserInfoByAccessToken(string $access_token): ?array
    {
        // 先验证 token 有效性（可选，提升安全性）
        if (!self::verifyAccessToken($access_token)) {
            return null;
        }

        try {
            $client = new Client(Config::get('google.guzzle'));
            $response = $client->get('https://www.googleapis.com/oauth2/v3/userinfo', [
                'headers' => [
                    'Accept' => 'application/json',
                    'Authorization' => "Bearer {$access_token}" // 推荐用 Header 传递 token
                ]
            ]);

            $userInfo = json_decode($response->getBody()->getContents(), true);

            // 校验用户信息核心字段（sub 是 Google 唯一用户 ID）
            if (empty($userInfo['sub'])) {
                error_log('Google 用户信息解析失败：缺少核心字段 sub');
                return null;
            }

            // 整理用户信息（适配本地业务需求）
            return [
                'google_id' => $userInfo['sub'] ?? '', // 唯一标识（推荐作为本地用户关联字段）
                'email' => $userInfo['email'] ?? '',
                'email_verified' => $userInfo['email_verified'] ?? false,
                'name' => $userInfo['name'] ?? '',
                'given_name' => $userInfo['given_name'] ?? '',
                'family_name' => $userInfo['family_name'] ?? '',
                'avatar' => $userInfo['picture'] ?? '', // 头像 URL，可拼接 ?sz=200 调整尺寸
                'locale' => $userInfo['locale'] ?? 'en',
                'hd' => $userInfo['hd'] ?? '' // 企业邮箱域名（仅 G Suite 用户有）
            ];
        } catch (RequestException $e) {
            $errorMsg = $e->getMessage();
            if ($e->hasResponse()) {
                $errorBody = json_decode($e->getResponse()->getBody()->getContents(), true);
                $errorMsg = $errorBody['error_description'] ?? $errorBody['error'] ?? $errorMsg;
            }
            trace(["Google UserInfo API 请求失败" => $errorMsg]);
            return null;
        }
    }
}
